#ifndef PRUEBATABLADEFRECUENCIAS_H_
#define PRUEBATABLADEFRECUENCIAS_H_

#include "../TablaDeFrecuenciasCompresion.h"
#include <iostream>
#include <cmath>

using namespace Toolkit;

using namespace std;

void pruebaTablaDeFrecuenciasBase()
{
	TablaDeFrecuenciasCompresion tabla;

// Inicialmente, todos las apariciones son 1 (en contexto a 'e')
	for (unsigned int i = 0; i < 256; ++i)
	{
		unsigned int piso, techo;

		tabla.calcularRango(i, piso, techo);
		if (techo != (i+1) || piso != (i+1))
			cout<<"simbolo : "<<(unsigned char)i<<" \tpiso: "<<piso<<"\t techo: "<<techo<<endl;
	}
// Incremento la frecuencia de 'b', como si acabara de emitirla
	tabla.aumentarFrecuencia('b');

// La nueva tabla de apariciones sera la misma q antes, por q el contexto cambio a 'b'.
	for (unsigned int i = 0; i < 256; ++i)
	{
		unsigned int piso, techo;

		tabla.calcularRango(i, piso, techo);
		if (techo != (i+1) || piso != (i+1))
			cout<<"simbolo : "<<(unsigned char)i<<" \tpiso: "<<piso<<"\t techo: "<<techo<<endl;
	}


// Incremento la frecuencia de 'b', pero ahora el contexto sigue siendo el mismo
	tabla.aumentarFrecuencia('b');

// Ahora si deberia ver un cambio reflejado en las frecuencias
	for (unsigned int i = 0; i < 256; ++i)
	{
		unsigned int piso, techo;

		tabla.calcularRango(i, piso, techo);
		if (techo != (i+1) || piso != (i+1))
			{
				unsigned int resultadoCorrecto = i<<(sizeof(int)*8-(int)ceil(log2(257)));

				if ( i < 98 && (techo != (resultadoCorrecto+1) || piso != (resultadoCorrecto+1)) )
					cout<<"1 simbolo : "<<(unsigned char)i<<" \tnumero : "<<i<<" \tpiso: "<<hex<<piso<<"\t techo: "<<techo<<dec<<endl;
				if (i == 98 && (techo != (resultadoCorrecto+2) || piso != (resultadoCorrecto+1)) )
					cout<<"2 simbolo : "<<(unsigned char)i<<" \tnumero : "<<i<<" \tpiso: "<<hex<<piso<<"\t techo: "<<techo<<dec<<endl;
				if ( i > 98 && (techo != (resultadoCorrecto+2) || piso != (resultadoCorrecto+2)) )
					cout<<"3 simbolo : "<<(unsigned char)i<<" \tnumero : "<<i<<" \tpiso: "<<hex<<piso<<"\t techo: "<<techo<<dec<<endl;
			}
	}

	unsigned int asd = 511<<(sizeof(int)*8-(int)ceil(log2(257)));
	cout<<sizeof(int)<<endl;
	cout<<log2(256)<<endl;
	cout<<log2(257)<<endl;
	cout<<ceil(log2(257))<<endl;
	cout<<sizeof(int)*8-ceil(log2(257))<<endl;
	cout<<hex<<asd<<endl;

	asd = asd>>(sizeof(int)*8 - 1);
	cout<<asd<<endl;
	cout<<"termine prueba Tabla De Frecuencias Base"<<endl;
}

#endif /* PRUEBATABLADEFRECUENCIAS_H_ */
